# Replication Package for "How Workers Keep Up With Inflation"

**Authors:** Hassan Afrouzi, Andres Blanco, Andres Drenik, and Erik Hurst

---

## Table of Contents

- [Overview](#overview)
- [Data Availability and Provenance](#data-availability-and-provenance)
- [Computational Requirements](#computational-requirements)
- [Instructions to Replicators](#instructions-to-replicators)
- [Part 1: Model Results](#part-1-model-results)
- [Part 2: Empirical Results](#part-2-empirical-results)
- [List of Figures and Tables](#list-of-figures-and-tables)
- [Pooling Outputs](#pooling-outputs)
- [License](#license)
- [References](#references)

---

## Overview

This replication package reproduces all results reported in the paper *"How Workers Keep Up With Inflation"* (Afrouzi, Blanco, Drenik, and Hurst, 2026). The package consists of two main parts:

1. **Model Results** (`model/`): Julia code that solves the theoretical model, runs calibration routines, simulates worker and firm decisions under inflation shocks, and generates model-based figures and tables.

2. **Empirical Results** (`empirics/`): Multi-language code (Python, Stata, R, Julia) that processes raw data from multiple sources, generates all empirical figures and tables in the main text and online appendix, and calculates moments used to calibrate the model.

A shell script (`pool_output.sh`) pools all outputs from both parts into a unified `out/` directory for convenience.

---

## Data Availability and Provenance

### Model

The model computations rely on **two external data files** stored in `model/input/`:

- `input/cpi_u_fred_updated.csv`: Publicly available CPI-U data from the Federal Reserve Bank of St. Louis (FRED).
- `input/base_wage_change_histogram_07_24_2024.csv`: Distribution of annual nominal wage changes from Grigsby, Hurst, and Yildirmaz (2021).

No proprietary or confidential data are required for model replication.

### Empirics

The empirical analysis uses data from multiple sources. Most data are publicly available and provided in the replication package. One dataset (`atl_fed_wage_raw.dta`) contains restricted microdata that cannot be redistributed.

#### Summary of Availability

All data **except** `atl_fed_wage_raw.dta` are publicly available and included in the package. As for `atl_fed_wage_raw.dta` a **placeholder file with synthetic data** (not the actual restricted microdata) is included for reproducibility of the code. The code includes fallback logic to run with this placeholder, but outputs depending on it will not match the published results (a detailed list is included below).

#### Details on Each Data Source

| Data Name | Data Files | Location | Provided | Citation |
|-----------|------------|----------|----------|----------|
| Job Openings and Labor Turnover Survey (JOLTS) | `jolts_level.csv`, `jolts_rates.csv`, `jolts_industry_level.xlsx`, `jolts_industry_rates.xlsx` | `data/raw/jolts` | TRUE | U.S. Bureau of Labor Statistics (2025) |
| Atlanta Fed Wage Tracker (ATL) | `atl_fed_wage.xlsx`, `atl_fed_wage_raw.dta` | `data/raw/atl_fed` | Partial | Federal Reserve Bank of Atlanta (2025) |
| St. Louis Fed (FRED) | `EU.csv`, `UE.csv`, `NU.csv`, `NE.csv`, `fred_urate.csv`, `fred_emp2pop.csv`, `fred_employment.csv`, `profit_share.csv`, `CPI.csv` | `data/raw/fred` | TRUE | U.S. Bureau of Labor Statistics (2025) |
| Employer-to-Employer Probability (FMP) | `fmp_ee_flow.csv` | `data/raw/fmp` | TRUE | Fujita, Moscarini, and Postel-Vinay (2024) |
| ADP Pay Insights (ADP) | `adp_pay_history.csv` | `data/raw/adp` | TRUE | ADP (2025) |
| Longitudinal Employer-Household Dynamics (LEHD) | `employment_by_education.csv`, `flows_by_education.csv` | `data/raw/lehd` | TRUE | U.S. Census Bureau (2025) |
| Barnichon Vacancy Stocks (BAR) | `barnichon_vacancy.xlsx` | `data/raw/barnichon` | TRUE | Barnichon (2010) |
| Work From Home Measure (WFH) | `onet_wfh_code.csv` | `data/raw/dingelneiman` | TRUE | Dingel and Neiman (2020) |
| Annual Hours Employed By Industry (BLS) | `hours_employed_industry.xlsx` | `data/raw/bls` | TRUE | U.S. Bureau of Labor Statistics (2025) |
| Gallup Analytics (GALL) | `gallup_data.xlsx` | `data/raw/gallup` | TRUE | Gallup Poll Social Series (2025) |
| Current Population Survey (CPS) | `cps_00110.dat`, `cps_00108.dat`, `cps_00111.dat` | `data/moments/raw`, `data/raw` | TRUE | Flood et al. (2024) |

#### Dataset List

##### Raw Data Files

| Data File | Source | Notes | Provided |
|-----------|--------|-------|----------|
| `data/raw/adp/adp_pay_history.csv` | ADP | Input for Figure 2.3.A and 2.3.B | Yes |
| `data/raw/atl_fed/atl_fed_wage_raw.dta` | ATL | Input for Figure 2.4, B.5.B, B.5.C, B.8, and Table B.2 | No (Placeholder included) |
| `data/raw/atl_fed/atl_fed_wage.xlsx` | ATL | Input for Figure 1.1.B, B.5.A, B.6, B.7 | Yes |
| `data/raw/barnichon/barnichon_vacancy.xlsx` | BAR | Input for Figure 1.1.A, 6.1.A, and 6.1.B | Yes |
| `data/raw/bls/hours_employed_industry.xlsx` | BLS | Input for Figure B.9 | Yes |
| `data/raw/cps/cps_00111.dat` | CPS | Input for flow_moments.csv | Yes |
| `data/raw/dingelneiman/onet_wfh_code.csv` | WFH | Input for Figure 2.4 and Table B.2 | Yes |
| `data/raw/fmp/fmp_ee_flow.csv` | FMP | Input for Figure 2.2.A | Yes |
| `data/raw/fred/CPI.csv` | FRED | Input for Figure 1.1, 2.3, 2.4, 6.1, B.1, B.6, B.7, B.8, B.14, B.15, Table B.3 | Yes |
| `data/raw/fred/EU.csv` | FRED | Input for Figure B.2, B.4 | Yes |
| `data/raw/fred/fred_emp2pop.csv` | FRED | Input for Figure B.2 | Yes |
| `data/raw/fred/fred_employment.csv` | FRED | Input for Figure 1.1.A, 2.2.B, 6.1, B.2, B.4, B.13 | Yes |
| `data/raw/fred/fred_urate.csv` | FRED | Input for Figure B.2 | Yes |
| `data/raw/fred/NE.csv` | FRED | Input for Figure B.3 | Yes |
| `data/raw/fred/NU.csv` | FRED | Input for Figure B.3 | Yes |
| `data/raw/fred/profit_share.csv` | FRED | Input for Figure B.14, B.15, Table B.4 | Yes |
| `data/raw/fred/UE.csv` | FRED | Input for Figure 2.2.B, B.4 | Yes |
| `data/raw/gallup/gallup_data.xlsx` | GALL | Input for Figure B.12 | Yes |
| `data/raw/jolts/jolts_industry_level.xlsx` | JOLTS | Input for Figure B.9 | Yes |
| `data/raw/jolts/jolts_industry_rates.xlsx` | JOLTS | Input for Figure B.9 | Yes |
| `data/raw/jolts/jolts_level.csv` | JOLTS | Input for Figure 1.1.A, 6.1, B.13 | Yes |
| `data/raw/jolts/jolts_rates.csv` | JOLTS | Input for Figure 2.1, B.1 | Yes |
| `data/raw/lehd/employment_by_education.csv` | LEHD | Input for Figure B.10 | Yes |
| `data/raw/lehd/flows_by_education.csv` | LEHD | Input for Figure B.10 | Yes |
| `data/moments/raw/CPI.xls` | FRED | Same data as CPI.csv | Yes |
| `data/moments/raw/cps_00108.dat` | CPS | Input for flow_moments.csv | Yes |
| `data/moments/raw/cps_00110.dat` | CPS | Input for flow_moments.csv and wkly_earn_moments.dta | Yes |
| `data/moments/raw/ee_monthly.csv` | FMP | Same data as figure_2_2_A | Yes |
| `data/moments/raw/shimer_decomposition_data.csv` | FRED | Same data as figure_B_4 | Yes |

##### Processed and Intermediate Data Files

| Data File | Source | Notes |
|-----------|--------|-------|
| `data/processed/figure_1_1_A.csv` | BAR, FRED, JOLTS | Combines barnichon_vacancy, fred_employment, jolts_level, and CPI |
| `data/processed/figure_1_1_B.csv` | ATL, FRED | Combines atl_fed_wage and CPI |
| `data/processed/figure_2_1.csv` | JOLTS | Uses jolts_rates |
| `data/processed/figure_2_2_A.csv` | FMP | Uses fmp_ee_flow |
| `data/processed/figure_2_2_B.csv` | FRED | Uses fred_employment and UE |
| `data/processed/figure_2_3.csv` | ADP, FRED | Combines adp_pay_history and CPI |
| `data/processed/figure_2_4.csv` | ATL, WFH, FRED | Combines atl_fed_wage_raw, onet_wfh_code, and CPI |
| `data/processed/figure_2_4_temp1.csv` | ATL, WFH, FRED | Intermediate file for Figure 2.4 |
| `data/processed/figure_2_4_temp2.csv` | ATL, WFH, FRED | Intermediate file for Figure 2.4 |
| `data/processed/figure_6_1.csv` | BAR, FRED, JOLTS | Combines barnichon_vacancy, fred_employment, jolts_level, and CPI |
| `data/processed/figure_B_1.csv` | JOLTS, FRED | Combines jolts_rates and CPI |
| `data/processed/figure_B_2.csv` | FRED | Combines fred_employment, UE, fred_urate, and fred_emp2pop |
| `data/processed/figure_B_3.csv` | FRED | Combines NE and NU |
| `data/processed/figure_B_4.csv` | FRED | Combines fred_employment, EU, and UE |
| `data/processed/figure_B_5_A.csv` | ATL | Uses atl_fed_wage |
| `data/processed/figure_B_5_B_C.csv` | ATL | Uses atl_fed_wage_raw |
| `data/processed/figure_B_6.csv` | ATL, FRED | Combines atl_fed_wage and CPI |
| `data/processed/figure_B_7.csv` | ATL, FRED | Combines atl_fed_wage and CPI |
| `data/processed/figure_B_8.csv` | ATL, FRED | Combines atl_fed_wage_raw and CPI |
| `data/processed/figure_B_8_temp1.csv` | ATL, FRED | Intermediate file for Figure B.8 |
| `data/processed/figure_B_8_temp2.csv` | ATL, FRED | Intermediate file for Figure B.8 |
| `data/processed/figure_B_8_temp3.csv` | ATL, FRED | Intermediate file for Figure B.8 |
| `data/processed/figure_B_9.csv` | BLS, JOLTS | Combines hours_employed_industry, jolts_industry_level, and jolts_industry_rates |
| `data/processed/figure_B_10.csv` | LEHD | Combines flows_by_education and employment_by_education |
| `data/processed/figure_B_12.csv` | GALL | Uses gallup_data |
| `data/processed/figure_B_13.csv` | JOLTS, FRED | Combines jolts_level and fred_employment |
| `data/processed/figure_B_14_A.csv` | FRED, BAR, JOLTS | Combines CPI, profit_share |
| `data/processed/figure_B_14_B.csv` | FRED, BAR, JOLTS | Combines CPI, profit_share |
| `data/processed/figure_B_15.csv` | FRED, BAR, JOLTS | Combines CPI, profit_share |
| `data/processed/table_B_2.dta` | ATL, WFH | Processed data for Table B.2 |
| `data/moments/output/flow_moments.csv` | FRED, CPS, FMP | Calculated moments |
| `data/moments/output/wkly_earn_moments.csv` | FRED, CPS, FMP | Calculated moments |
| `data/moments/temp/asec_weekly_earnings_dist.dta` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/asec_wkly_earnings_dist.xlsx` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/asec_workers_by_earn_decile.dta` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/cpi_clean.dta` | FRED | Intermediate file for moments calculation |
| `data/moments/temp/cps_basic_monthly_matched.dta` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/gross_flows_v1.dta` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/pre_period_macro_average_1.dta` | FRED, CPS, FMP | Intermediate file for moments calculation |
| `data/moments/temp/pre_period_macro_average_2.dta` | FRED, CPS, FMP | Intermediate file for moments calculation |
| `data/moments/temp/pre_period_micro_average.dta` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/scaling_factors.dta` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/wkly_earn_moments.dta` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/wkly_earn_moments_all.dta` | CPS | Intermediate file for moments calculation |
| `data/moments/temp/wkly_earn_moments_young_age.dta` | CPS | Intermediate file for moments calculation |

#### Data Download Instructions

- **JOLTS**: Download from https://www.bls.gov/jlt/data.htm using the One Screen or Multi-Screen tools.
- **Atlanta Fed Wage Tracker**: Processed data from https://www.atlantafed.org/chcs/wage-growth-tracker. Underlying microdata requires separate access.
- **FRED**: Download individual series:
  - `EU.csv`: https://fred.stlouisfed.org/series/LNS17400000
  - `UE.csv`: https://fred.stlouisfed.org/series/LNS17100000
  - `fred_urate.csv`: https://fred.stlouisfed.org/series/UNRATE
  - `fred_emp2pop.csv`: https://fred.stlouisfed.org/series/LREM64TTUSM156S
  - `CPI.csv`: https://fred.stlouisfed.org/series/CPIAUCSL
  - `NE.csv`: LNS17200000 divided by LNS15000000
  - `NU.csv`: LNS17600000 divided by LNS15000000
  - `fred_employment.csv`: CE16OV merged with UNEMPLOY
  - `profit_share.csv`: CP divided by GDP
- **FMP**: https://www.philadelphiafed.org/surveys-and-data/macroeconomic-data/employer-to-employer-transition-probability
  - Also available from FRED: https://fred.stlouisfed.org/series/FMPSA3MA
  - Note that the 3-months moving averages differ between two datasets due to the different initial time periods, and we used the series downloaded from the FRED website for our analysis.
- **ADP**: https://payinsights.adp.com/
- **LEHD**: https://ledextract.ces.census.gov/
  - To download `employment_by_education.csv`: Go to 'All QWI Measures' page, select 'Sex and Education' in '3. Worker Characteristics' tab, select all the education levels from E1 to E5, and select the quarters from 2016Q1 to 2024Q1.
  - To download `flows_by_education.csv`: The same procedure must be done in 'Job Flows' page.
- **Barnichon Vacancy**: https://sites.google.com/site/regisbarnichon/research
  - See under '19. Building a composite Help-Wanted Index' and click the associated Google Sheets link to download the data.
- **Dingel-Neiman WFH**: https://github.com/jdingel/DingelNeiman-workathome/tree/master/onet_to_BLS_crosswalk/output
- **BLS Hours**: https://www.bls.gov/productivity/technical-notes/industry-hours-and-employment.htm
  - Data on annual hours worked and employment by industry can be downloaded from the link in the bottom paragraph.
- **CPS**: https://cps.ipums.org/cps/
  - In 'Select Data' tab, replicators can select the data filters to obtain the same datasets used for moment generation of this paper.
  - To extract the yearly ASEC data (`cps_00110.dat`): Select the yearly 'IPUMS-CPS.ASEC' series from 2015 to 2023 and select the same set of variables as detailed in `/code/4_moments/4_0_build.do`.
  - To extract the monthly worker flows data (`cps_00108.dat`, `cps_00111.dat`): Select the monthly 'IPUMS-CPS' series from January 2014 to June 2024.
- **Gallup Analytics**: Requires institutional subscription (accessed via University of Chicago proxy at https://analyticscampus-gallup-com.proxy.uchicago.edu/Tables).

---

## Computational Requirements

### Software Requirements

**Model:**
- Julia 1.12  
(All dependencies listed in `model/Project.toml` and `model/Manifest.toml`)

**Empirics:**
- Stata 19
- Python 3.13.5 with packages: `pandas`, `numpy`, `matplotlib`, `scikit-learn`, `statsmodels`, `openpyxl`, `xlrd`, `jinja2`
- Julia 1.12 with packages: `Binscatters`, `CSV`, `CategoricalArrays`, `DataFrames`, `DataFramesMeta`, `FileIO`, `LaTeXStrings`, `PGFPlotsX`, `PanelDataTools`, `PeriodicalDates`, `Plots`, `Revise` (see `empirics/code/Project.toml`)
- R with packages: `dplyr`, `haven`, `ipumsr`, `writexl`
- Stata packages: `esttab`, `egenmore`

### Controlled Randomness

**Model:** Random seeds are set for reproducibility. The main seed is `Random.seed!(1234)` in `0_run_main.jl`. Additional seeds (`42`, `43`, `123`, `1234`) are set in `6_simulations.jl` for specific simulation routines.

**Empirics:** Stata uses `set seed 12345` for generating synthetic placeholder data when the restricted `atl_fed_wage_raw.dta` file is unavailable (see fallback logic in `1_0_process_main.do` and `1_2_process_appendix.do`).

### Memory, Runtime, and Storage Requirements

**Model:**
- Runtime: 36~48 hours 
- Memory: Standard laptop sufficient
- Storage: < 100 MB for produced output

**Empirics:**
- Runtime: ~10 minutes 
- Memory: Standard laptop sufficient
- Storage: < 1 GB for produced processed files and output

The code was last run on a 16-inch MacBook Pro (2024) with Apple M4 Max, 48 GB unified memory, macOS Tahoe 26.3 (b).

---

## Instructions to Replicators

### Quick Start

1. **Empirics**: Run `empirics/code/run_all.py` after editing executable paths for Stata, Julia, and R at the top of the file.

2. **Model**: Run `model/0_run_main.jl` in Julia with the project environment activated.

3. **Pool outputs**: Run `./pool_output.sh` from the replication root to consolidate all outputs into `out/`.

### Detailed Instructions

See the sections below for each component.

---

# Part 1: Model Results

This section describes the replication of the theoretical model results.

## Overview

Running **`0_run_main.jl`** reproduces all model results reported in the paper. This includes:

- Solving the steady state
- Computing distributions
- Running calibration routines
- Simulating worker and firm decisions under inflation shocks
- Generating all model figures and tables

By default, the scripts write:
- **PDF figures** to `model/figures/`
- **LaTeX tables** (`.tex`) to `model/tables/`
- Intermediate objects to `model/temp/`

The codebase is entirely in Julia.

## Instructions

### macOS/Linux

Open the `model/` folder in a terminal and run:

```sh
julia --project -e 'using Pkg; Pkg.instantiate(); include("0_run_main.jl")'
```

### Windows

Open the `model/` folder in Command Prompt and run:

```sh
julia --project -e "using Pkg; Pkg.instantiate(); include(\"0_run_main.jl\")"
```

### Alternative: Using IDE or REPL

1. Start Julia with the working directory set to `model/`.
2. Run:
   ```julia
   using Pkg
   Pkg.activate(".")
   Pkg.instantiate()
   include("0_run_main.jl")
   ```

## Directory Structure

```text
model/
├── 0_run_main.jl               # Master script
├── 1_setup.jl                  # Parameters, grids, primitives
├── 2_menufun.jl                # Core model functions
├── 3_solve_ss.jl               # Steady-state solver
├── 4_check_solution.jl         # Diagnostics and consistency checks
├── 5_solve_distributions.jl    # Stationary distribution and dynamics
├── 6_simulations.jl            # Stochastic simulation
├── 7_calibration.jl            # Calibration routines
├── 8_main_exercises.jl         # Main exercises
├── 9_figures_tables.jl         # Figure and table generation
├── input/                      # External data files
├── figures/                    # Output figures (.pdf)
├── tables/                     # Output tables (.tex)
├── temp/                       # Temporary objects
├── Project.toml                # Julia environment
└── Manifest.toml               # Exact package versions
```

---

# Part 2: Empirical Results

This section describes the replication of the empirical results.

## Overview

The program files in this replication package analyze data from multiple sources using Python, Stata, R and Julia. One main file (`run_all.py`) runs the codes that:

1. Generate all figures and tables in the main text and the online appendix of the paper.
2. Calculate moments to calibrate this paper's model.

Replicators should expect the code to run about 10 minutes.

## Description of Programs

- `code/run_all.py`: Master script that runs all dependencies. Paths are automatically adjusted.
- `code/1_process/`: Programs that process primitive data in `data/raw/` and save processed data in `data/processed/`.
- `code/2_figures/`: Programs that use processed data and generate outputs in `output/figures/` and `output/tables/`.
- `code/4_moments/`: Programs that calculate model moments using primitive data in `data/moments/raw/` and save output in `data/moments/output/`.

## Instructions

1. Download the data files referenced above. Each data file must be stored in the prepared subdirectories inside the `data/` folder.
2. Run files in `code/0_setup/` to ensure that required packages are installed for all programming languages.
3. Edit the lines at the top of `run_all.py` to adjust the executable paths for Stata, Julia, and R.
4. Run `run_all.py`.

**Note:** Replicators can also manually install the required packages listed in the "Computational Requirements" section.

## Outputs Affected by Missing Data

The following figures and table depend on the restricted `atl_fed_wage_raw.dta` file and **cannot be exactly replicated** without access to the actual Atlanta Fed Wage Tracker microdata (a placeholder file with synthetic data is included):

**Figures:**
- Figure 2.4 (Panels A, B, C)
- Figure B.5 (Panels B, C)
- Figure B.8 (Panels A, B, C, D)

**Tables:**
- Table B.2

When running with synthetic/fake data, the code includes fallback logic that generates placeholder outputs for these figures and table, but they will not match the published results.

## Directory Structure

```text
empirics/
├── code/
│   ├── run_all.py              # Master script
│   ├── 0_setup/                # Setup scripts for all languages
│   ├── 1_process/              # Data processing scripts
│   ├── 2_figures/              # Figure generation scripts
│   ├── 3_tables/               # Table generation scripts
│   └── 4_moments/              # Moment calculation scripts
├── data/
│   ├── raw/                    # Raw input data
│   ├── processed/              # Processed intermediate data
│   └── moments/                # Moment calculation data
└── output/
    ├── figures/                # Output figures (.pdf)
    └── tables/                 # Output tables (.tex)
```

---

# List of Figures and Tables

| Figure/Table | Program | Output File |
|--------------|---------|-------------|
| Figure 1.1, Panel A | `empirics/code/1_process/1_1_process_main.py`, `empirics/code/2_figures/2_0_figures_main.jl` | `figure_1_1_A.pdf` |
| Figure 1.1, Panel B | `empirics/code/1_process/1_1_process_main.py`, `empirics/code/2_figures/2_0_figures_main.jl` | `figure_1_1_B.pdf` |
| Figure 2.1, Panels A–C | `empirics/code/1_process/1_1_process_main.py`, `empirics/code/2_figures/2_0_figures_main.jl` | `figure_2_1_A/B/C.pdf` |
| Figure 2.2, Panels A–B | `empirics/code/1_process/1_1_process_main.py`, `empirics/code/2_figures/2_0_figures_main.jl` | `figure_2_2_A/B.pdf` |
| Figure 2.3, Panels A–B | `empirics/code/1_process/1_1_process_main.py`, `empirics/code/2_figures/2_0_figures_main.jl` | `figure_2_3_A/B.pdf` |
| Figure 2.4, Panels A–C | `empirics/code/1_process/1_0_process_main.do`, `empirics/code/1_process/1_1_process_main.py`, `empirics/code/2_figures/2_0_figures_main.jl` | `figure_2_4_A/B/C.pdf` |
| Figure 3.1, Panel A | `model/8_main_exercises.jl` | `SS_policy_values_normalized.pdf` → `figure_3_1_A.pdf` |
| Figure 3.1, Panel B | `model/8_main_exercises.jl` | `SS_policy_hazard_rates.pdf` → `figure_3_1_B.pdf` |
| Figure 3.1, Panel C | `model/8_main_exercises.jl` | `SS_policy_bargaining_search_wages.pdf` → `figure_3_1_C.pdf` |
| Figure 4.1, Panel A | `model/9_figures_tables.jl` | `Calibration_job_finding_rate.pdf` → `figure_4_1_A.pdf` |
| Figure 4.1, Panel B | `model/9_figures_tables.jl` | `Calibration_job_to_job_rate.pdf` → `figure_4_1_B.pdf` |
| Figure 4.1, Panel C | `model/9_figures_tables.jl` | `Calibration_separation_rate_total.pdf` → `figure_4_1_C.pdf` |
| Figure 4.2, Panel A | `model/9_figures_tables.jl` | `Calibration_markdown_by_z_decile.pdf` → `figure_4_2_A.pdf` |
| Figure 4.2, Panel B | `model/9_figures_tables.jl` | `Calibration_distribution_onthejob_wage_changes.pdf` → `figure_4_2_B.pdf` |
| Figure 5.1 | `model/8_main_exercises.jl` | `MIT_shock_deltap_dist_what_employed.pdf` → `figure_5_1.pdf` |
| Figure 5.2, Panel A | `model/8_main_exercises.jl` | `MIT_shock_deltap_avg_logrinc_emp_normlevel.pdf` → `figure_5_2_A.pdf` |
| Figure 5.2, Panel B | `model/8_main_exercises.jl` | `MIT_shock_deltap_agg_tightness_normratio.pdf` → `figure_5_2_B.pdf` |
| Figure 5.2, Panel C | `model/8_main_exercises.jl` | `MIT_shock_deltap_beveridge.pdf` → `figure_5_2_C.pdf` |
| Figure 5.3, Panel A | `model/8_main_exercises.jl` | `MIT_shock_deltap_avg_seffort_emp_normratio.pdf` → `figure_5_3_A.pdf` |
| Figure 5.3, Panel B | `model/8_main_exercises.jl` | `MIT_shock_deltap_jj_rate_normratio.pdf` → `figure_5_3_B.pdf` |
| Figure 5.3, Panel C | `model/8_main_exercises.jl` | `MIT_shock_deltap_avg_w_star_jj_normratio.pdf` → `figure_5_3_C.pdf` |
| Figure 5.4, Panel A | `model/8_main_exercises.jl` | `MIT_shock_deltap_vacancies_jj_normratio.pdf` → `figure_5_4_A.pdf` |
| Figure 5.4, Panel B | `model/8_main_exercises.jl` | `MIT_shock_deltap_vfilling_rate_jj_normratio.pdf` → `figure_5_4_B.pdf` |
| Figure 5.4, Panel C | `model/8_main_exercises.jl` | `MIT_shock_deltap_dur_vacancies_jj_normratio.pdf` → `figure_5_4_C.pdf` |
| Figure 5.5, Panel A | `model/8_main_exercises.jl` | `MIT_shock_deltap_freq_wage_increase.pdf` → `figure_5_5_A.pdf` |
| Figure 5.5, Panel B | `model/8_main_exercises.jl` | `MIT_shock_deltap_avg_barg_Δw.pdf` → `figure_5_5_B.pdf` |
| Figure 5.5, Panel C | `model/8_main_exercises.jl` | `MIT_shock_deltap_avg_jj_Δw.pdf` → `figure_5_5_C.pdf` |
| Figure 5.6, Panel A | `model/8_main_exercises.jl` | `MIT_shock_deltap_avg_seffort_emp_by_z_normratio.pdf` → `figure_5_6_A.pdf` |
| Figure 5.6, Panel B | `model/8_main_exercises.jl` | `MIT_shock_deltap_jj_rate_by_z_normratio.pdf` → `figure_5_6_B.pdf` |
| Figure 5.6, Panel C | `model/8_main_exercises.jl` | `MIT_shock_deltap_avg_logrinc_emp_by_z_normlevel.pdf` → `figure_5_6_C.pdf` |
| Figure 5.7, Panel A | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_jj_rate_by_z_normratio.pdf` → `figure_5_7_A.pdf` |
| Figure 5.7, Panel B | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_avg_logrinc_emp_by_z_normlevel.pdf` → `figure_5_7_B.pdf` |
| Figure 5.7, Panel C | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_agg_tightness_normratio.pdf` → `figure_5_7_C.pdf` |
| Figure 5.8, Panel A | `model/8_main_exercises.jl` | `MIT_comparison_p_fw_value_w_emp_avg.pdf` → `figure_5_8_A.pdf` |
| Figure 5.8, Panel B | `model/8_main_exercises.jl` | `MIT_comparison_p_fw_value_w_emp_hist.pdf` → `figure_5_8_B.pdf` |
| Figure 5.8, Panel C | `model/8_main_exercises.jl` | `MIT_shock_deltap_welfare_decomposition_alternative.pdf` → `figure_5_8_C.pdf` |
| Figure 6.1, Panels A–B | `empirics/code/1_process/1_1_process_main.py`, `empirics/code/2_figures/2_0_figures_main.jl`, `empirics/code/2_figures/2_1_figures_main.py` | `figure_6_1_A/B.pdf` |
| Figure B.1, Panels A–B | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_1_A/B.pdf` |
| Figure B.2, Panels A–C | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_2_A/B/C.pdf` |
| Figure B.3, Panels A–B | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_3_A/B.pdf` |
| Figure B.4 | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_4.pdf` |
| Figure B.5, Panel A | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_5_A.pdf` |
| Figure B.5, Panels B–C | `empirics/code/1_process/1_2_process_appendix.do`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_5_B/C.pdf` |
| Figure B.6, Panels A–D | `empirics/code/1_process/1_1_process_main.py`, `empirics/code/2_figures/2_2_figures_appendix.jl` | `figure_B_6_A/B/C/D.pdf` |
| Figure B.7, Panels A–C | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_7_A/B/C.pdf` |
| Figure B.8, Panels A–D | `empirics/code/1_process/1_2_process_appendix.do`, `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_2_figures_appendix.jl` | `figure_B_8_A/B/C/D.pdf` |
| Figure B.9 | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_9.pdf` |
| Figure B.10, Panels A–B | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_10_A/B.pdf` |
| Figure B.11 | Source: Grigsby, Hurst, and Yildirmaz (2021) | - |
| Figure B.12 | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_12.pdf` |
| Figure B.13 | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_13.pdf` |
| Figure B.14, Panels A–B | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_2_figures_appendix.jl`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_14_A/B.pdf` |
| Figure B.15 | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/2_figures/2_3_figures_appendix.py` | `figure_B_15.pdf` |
| Figure B.16, Panel A | `model/8_main_exercises.jl` | `MIT_shock_deltap_jf_rate.pdf` → `figure_B_16_A.pdf` |
| Figure B.16, Panel B | `model/8_main_exercises.jl` | `MIT_shock_deltap_layoff_rate_normratio.pdf` → `figure_B_16_B.pdf` |
| Figure B.17, Panel A | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_jf_rate.pdf` → `figure_B_17_A.pdf` |
| Figure B.17, Panel B | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_layoff_rate_normratio.pdf` → `figure_B_17_B.pdf` |
| Figure C.1, Panel A | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_jj_rate_normratio_robustness_phi_s.pdf` → `figure_C_1_A.pdf` |
| Figure C.1, Panel B | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_avg_w_star_jj_normratio_robustness_phi_s.pdf` → `figure_C_1_B.pdf` |
| Figure C.1, Panel C | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_avg_logrinc_emp_normlevel_robustness_phi_s.pdf` → `figure_C_1_C.pdf` |
| Figure C.1, Panel D | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_agg_tightness_normratio_robustness_phi_s.pdf` → `figure_C_1_D.pdf` |
| Figure C.2, Panel A | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_avg_logrinc_emp_normlevel_robustness_tau.pdf` → `figure_C_2_A.pdf` |
| Figure C.2, Panel B | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_jj_rate_normratio_robustness_tau.pdf` → `figure_C_2_B.pdf` |
| Figure C.2, Panel C | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_agg_tightness_normratio_robustness_tau.pdf` → `figure_C_2_C.pdf` |
| Figure C.3, Panel A | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_avg_logrinc_emp_normlevel_robustness_gamma_e.pdf` → `figure_C_3_A.pdf` |
| Figure C.3, Panel B | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_jj_rate_normratio_robustness_gamma_e.pdf` → `figure_C_3_B.pdf` |
| Figure C.3, Panel C | `model/8_main_exercises.jl` | `MIT_shock_sequence_deltap_agg_tightness_normratio_robustness_gamma_e.pdf` → `figure_C_3_C.pdf` |
| Table 1 | `model/9_figures_tables.jl` | `calibration_table_exogenous.tex` → `table_1.tex` |
| Table 2 | `model/9_figures_tables.jl` | `calibration_table_calibrated.tex` → `table_2.tex` |
| Table 3 | `model/9_figures_tables.jl` | `goodness_of_fit_table.tex` → `table_3.tex` |
| Table 4 | `empirics/code/1_process/1_1_process_main.py`, `empirics/code/3_tables/3_0_tables_main.py` | `table_4.tex` |
| Table B.1 | `empirics/code/3_tables/3_2_tables_appendix.do` | `table_B_1.tex` |
| Table B.2 | `empirics/code/1_process/1_2_process_appendix.do`, `empirics/code/3_tables/3_2_tables_appendix.do` | `table_B_2.tex` |
| Table B.3 | `empirics/code/3_tables/3_1_tables_appendix.py` | `table_B_3.tex` |
| Table B.4 | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/3_tables/3_1_tables_appendix.py` | `table_B_4.tex` |
| Table B.5 | `empirics/code/1_process/1_3_process_appendix.py`, `empirics/code/3_tables/3_1_tables_appendix.py` | `table_B_5.tex` |
| Table C.1 | `model/7_calibration.jl` | `Calibration_GS_sensitivity_avg_plain.pdf` → `table_C_1.pdf` |
| Table C.2 | `model/8_main_exercises.jl` | `Robustness_welfare_counterfactual_1_elasticity.tex` → `table_C_2.tex` |
| Table D.1 | `model/8_main_exercises.jl` | `comparison_shocks.tex` → `table_D_1.tex` |

---

# Pooling Outputs

A shell script `pool_output.sh` is provided at the root of the replication package to consolidate all outputs from both the model and empirical components into a single `out/` directory.

## Usage

From the replication root directory, run:

```sh
./pool_output.sh
```

This will:
1. Create the `out/` directory (if it doesn't exist).
2. Copy all figures from `model/figures/` and `empirics/output/figures/` to `out/`.
3. Copy all tables from `model/tables/` and `empirics/output/tables/` to `out/`.
4. Log all operations with timestamps to `pool_output.log`.

The log file provides a record of all files copied, useful for verifying the replication was complete.

---

## License

This replication package is released under the **MIT License**. See the included `LICENSE` file.

---

## References

ADP Research Institute. (2025, June). ADP® Pay Insights. Retrieved July 21, 2025.

Barnichon, R. (2010). "Building a composite Help-Wanted Index." *Economics Letters*, 109(3), 175–178.

Bureau of Labor Statistics, Office of Productivity and Technology. Annual Hours Worked and Employment: Detailed Industries. Data released April 24, 2025. Retrieved July 21, 2025.

Dingel, J. I., and B. Neiman (2020). "How many jobs can be done at home?" *Journal of Public Economics*, 189, 104235.

Federal Reserve Bank of Atlanta. Wage Growth Tracker. https://www.atlantafed.org/chcs/wage-growth-tracker (accessed July 21, 2025).

Federal Reserve Bank of Philadelphia. 3-Month Moving Average of Average Probability of U.S. Workers Making Employer to Employer Transitions [FMPSA3MA]. Retrieved from FRED, Federal Reserve Bank of St. Louis; https://fred.stlouisfed.org/series/FMPSA3MA, July 21, 2025.

Flood, S., M. King, R. Rodgers, S. Ruggles, J. R. Warren, D. Backman, A. Chen, G. Cooper, S. Richards, M. Schouweiler, and M. Westberry (2024). IPUMS CPS: Version 12.0 [dataset]. Minneapolis, MN: IPUMS. https://doi.org/10.18128/D030.V12.0

Fujita, S., G. Moscarini, and F. Postel-Vinay (2024). "Employer-to-Employer Transitions." Federal Reserve Bank of Philadelphia.

Gallup Poll Social Series (2025). Gallup Analytics Campus Portal.

Grigsby, J., E. Hurst, and A. Yildirmaz (2021). "Aggregate Nominal Wage Adjustments: New Evidence from Administrative Payroll Data." *American Economic Review*, 111(2), 428–471.

U.S. Bureau of Labor Statistics. Job Openings and Labor Turnover Survey (JOLTS). Retrieved July 21, 2025.

U.S. Bureau of Labor Statistics. Consumer Price Index for All Urban Consumers [CPIAUCSL]. Retrieved from FRED, July 21, 2025.

U.S. Bureau of Economic Analysis. Corporate Profits After Tax [CP] and Gross Domestic Product [GDP]. Retrieved from FRED, July 21, 2025.

U.S. Census Bureau, Center for Economic Studies. LEHD. https://ledextract.ces.census.gov/, accessed July 21, 2025.

---

*Last updated: January 2026*
